36 #include "sensor_drv.h" 37 #include "sensor_io_i2c.h" 39 #include "fxas21002.h" 42 #define FXAS21000_STATUS 0x00 43 #define FXAS21000_F_STATUS 0x08 44 #define FXAS21000_F_SETUP 0x09 45 #define FXAS21000_WHO_AM_I 0x0C 46 #define FXAS21000_CTRL_REG0 0x0D 47 #define FXAS21000_CTRL_REG1 0x13 48 #define FXAS21000_CTRL_REG2 0x14 49 #define FXAS21000_WHO_AM_I_VALUE 0xD1 // engineering and production 50 #define FXAS21000_COUNTSPERDEGPERSEC 20 // 1600dps range 51 #define FXAS21002_COUNTSPERDEGPERSEC 16 // for 2000dps=32000 counts 53 #define FXAS21002_GYRO_FIFO_SIZE 32 58 const registerreadlist_t FXAS21002_WHO_AM_I_READ[] =
60 { .readFrom = FXAS21002_WHO_AM_I, .numBytes = 1 }, __END_READ_DATA__
64 const registerreadlist_t FXAS21002_F_STATUS_READ[] =
66 { .readFrom = FXAS21002_STATUS, .numBytes = 1 }, __END_READ_DATA__
70 registerreadlist_t FXAS21002_DATA_READ[] =
72 { .readFrom = FXAS21002_OUT_X_MSB, .numBytes = 1 }, __END_READ_DATA__
76 const registerwritelist_t FXAS21000_Initialization[] =
113 #if (GYRO_ODR_HZ <= 1) // select 1.5625Hz ODR 115 #elif (GYRO_ODR_HZ <= 3) // select 3.125Hz ODR 117 #elif (GYRO_ODR_HZ <= 6) // select 6.25Hz ODR 119 #elif (GYRO_ODR_HZ <= 12) // select 12.5Hz ODR 121 #elif (GYRO_ODR_HZ <= 25) // select 25.0Hz ODR 123 #elif (GYRO_ODR_HZ <= 50) // select 50.0Hz ODR 125 #elif (GYRO_ODR_HZ <= 100) // select 100.0Hz ODR 127 #else // select 200Hz ODR 134 const registerwritelist_t FXAS21002_Initialization[] =
143 { FXAS21002_CTRL_REG1, 0x00, 0x00 },
147 { FXAS21002_F_SETUP, 0x40, 0x00 },
155 { FXAS21002_CTRL_REG0, 0x00, 0x00 },
163 { FXAS21002_CTRL_REG3, 0x08, 0x00 },
180 #if (GYRO_ODR_HZ <= 12) // select 12.5Hz ODR 181 { FXAS21002_CTRL_REG1, 0x1A, 0x00 },
182 #elif (GYRO_ODR_HZ <= 25) // select 25Hz ODR 183 { FXAS21002_CTRL_REG1, 0x16, 0x00 },
184 #elif (GYRO_ODR_HZ <= 50) // select 50Hz ODR 185 { FXAS21002_CTRL_REG1, 0x12, 0x00 },
186 #elif (GYRO_ODR_HZ <= 100) // select 100Hz ODR 187 { FXAS21002_CTRL_REG1, 0x0E, 0x00 },
188 #elif (GYRO_ODR_HZ <= 200) // select 200Hz ODR 189 { FXAS21002_CTRL_REG1, 0x0A, 0x00 },
190 #elif (GYRO_ODR_HZ <= 400) // select 400Hz ODR 191 { FXAS21002_CTRL_REG1, 0x06, 0x00 },
192 #else // select 800Hz ODR 193 { FXAS21002_CTRL_REG1, 0x02, 0x00 },
207 status = Register_I2C_Read(sensor->
bus_driver, sensor->
addr, FXAS21002_WHO_AM_I, 1, ®);
208 if (status==SENSOR_ERROR_NONE) {
209 sfg->Gyro.iWhoAmI = reg;
211 case FXAS21002_WHO_AM_I_WHOAMI_PROD_VALUE:
212 case FXAS21002_WHO_AM_I_WHOAMI_PRE_VALUE:
213 case FXAS21002_WHO_AM_I_WHOAMI_OLD_VALUE:
break;
216 return SENSOR_ERROR_INIT;
223 switch (sfg->Gyro.iWhoAmI) {
227 status = Sensor_I2C_Write(sensor->
bus_driver, sensor->
addr, FXAS21000_Initialization );
231 case (FXAS21002_WHO_AM_I_WHOAMI_PRE_VALUE):
232 case (FXAS21002_WHO_AM_I_WHOAMI_PROD_VALUE):
233 status = Sensor_I2C_Write(sensor->
bus_driver, sensor->
addr, FXAS21002_Initialization );
238 sfg->Gyro.iFIFOCount=0;
240 sfg->Gyro.isEnabled =
true;
249 uint8_t sensor_fifo_count = 1;
255 return SENSOR_ERROR_INIT;
259 status = Sensor_I2C_Read(sensor->
bus_driver, sensor->
addr, FXAS21002_F_STATUS_READ, I2C_Buffer );
260 if (status==SENSOR_ERROR_NONE) {
261 sensor_fifo_count = I2C_Buffer[0] & FXAS21002_F_STATUS_F_CNT_MASK ;
264 if (sensor_fifo_count == 0)
return(SENSOR_ERROR_READ);
271 if (sfg->Gyro.iWhoAmI == FXAS21002_WHO_AM_I_WHOAMI_OLD_VALUE)
274 FXAS21002_DATA_READ[0].readFrom = FXAS21002_OUT_X_MSB;
275 FXAS21002_DATA_READ[0].numBytes = 6;
278 for (j = 0; j < sensor_fifo_count; j++)
281 status = Sensor_I2C_Read(sensor->
bus_driver, sensor->
addr, FXAS21002_DATA_READ, I2C_Buffer );
283 if (status==SENSOR_ERROR_NONE) {
285 sample[
CHX] = (I2C_Buffer[0] << 8) | I2C_Buffer[1];
286 sample[
CHY] = (I2C_Buffer[2] << 8) | I2C_Buffer[3];
287 sample[
CHZ] = (I2C_Buffer[4] << 8) | I2C_Buffer[5];
296 FXAS21002_DATA_READ[0].readFrom = FXAS21002_OUT_X_MSB;
297 FXAS21002_DATA_READ[0].numBytes = 6 * sensor_fifo_count;
298 status = Sensor_I2C_Read(sensor->
bus_driver, sensor->
addr, FXAS21002_DATA_READ, I2C_Buffer );
300 if (status==SENSOR_ERROR_NONE) {
301 for (j = 0; j < sensor_fifo_count; j++) {
303 sample[
CHX] = (I2C_Buffer[6*j + 0] << 8) | I2C_Buffer[6*j + 1];
304 sample[
CHY] = (I2C_Buffer[6*j + 2] << 8) | I2C_Buffer[6*j + 3];
305 sample[
CHZ] = (I2C_Buffer[6*j + 4] << 8) | I2C_Buffer[6*j + 5];
317 const registerwritelist_t FXAS21002_IDLE[] =
329 status = Sensor_I2C_Write(sensor->
bus_driver, sensor->
addr, FXAS21002_IDLE );
331 sfg->Gyro.isEnabled =
false;
333 return SENSOR_ERROR_INIT;
#define F_USING_GYRO
nominally 0x0004 if a gyro is to be used, 0x0000 otherwise
#define CHY
Used to access Y-channel entries in various data data structures.
#define FXAS21000_CTRL_REG1
void addToFifo(FifoSensor *sensor, uint16_t maxFifoSize, int16_t sample[3])
addToFifo is called from within sensor driver read functions
The top level fusion structure.
void * bus_driver
should be of type (ARM_DRIVER_I2C* for I2C-based sensors, ARM_DRIVER_SPI* for SPI) ...
#define GYRO_FIFO_SIZE
FXAX21000, FXAS21002 have 32 element FIFO.
The FifoSensor union allows us to use common pointers for Accel, Mag & Gyro logical sensor structures...
#define FXAS21002_GYRO_FIFO_SIZE
FXAX21000, FXAS21002 have 32 element FIFO.
int8_t FXAS21002_Read(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
#define FXAS21000_CTRL_REG0
The sensor_fusion.h file implements the top level programming interface.
Provides function prototypes for driver level interfaces.
#define CHX
Used to access X-channel entries in various data data structures.
void conditionSample(int16_t sample[3])
conditionSample ensures that we never encounter the maximum negative two's complement value for a 16-...
int8_t FXAS21002_Idle(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
An instance of PhysicalSensor structure type should be allocated for each physical sensors (combo dev...
#define FXAS21000_COUNTSPERDEGPERSEC
uint16_t isInitialized
Bitfields to indicate sensor is active (use SensorBitFields from build.h)
#define FXAS21000_WHO_AM_I_VALUE
#define FXAS21002_COUNTSPERDEGPERSEC
SensorFusionGlobals sfg
This is the primary sensor fusion data structure.
#define FXAS21000_F_SETUP
int8_t FXAS21002_Init(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
uint16_t addr
I2C address if applicable.